package org.galio.tourcoruna.servicio;
import java.util.ArrayList;
import java.util.List;

import org.galio.tourcoruna.TipoLugar;
import org.galio.tourcoruna.modelo.CComercial;
import org.galio.tourcoruna.modelo.Hotel;
import org.galio.tourcoruna.modelo.Lugar;
import org.galio.tourcoruna.modelo.Monumento;
import org.galio.tourcoruna.modelo.Museo;


public class LugarServiceImpl implements LugarService
{
		
	private List<Lugar> lugares;
	
	public LugarServiceImpl (){
		lugares = LugarDAO.getLugaresDB ();
	}
	
	
	public List<Lugar> getAllLugares() {
		return lugares;
	}
	
	public List<Hotel> getAllHoteles(){
		List<Hotel> hoteles = new ArrayList<Hotel>();
		Class<Hotel> type = Hotel.class;
		for (Object lugar : lugares) if (type.isInstance(lugar)) hoteles.add((Hotel)lugar);
		return hoteles;
	}
	
	public List<CComercial> getAllCComerciales(){
		List<CComercial> ccomerciales = new ArrayList<CComercial>();
		Class<CComercial> type = CComercial.class;
		for (Object lugar : lugares) if (type.isInstance(lugar)) ccomerciales.add((CComercial)lugar);
		return ccomerciales;	
	}
	
	public List<Monumento> getAllMonumentos(){
		List<Monumento> monumentos = new ArrayList<Monumento>();
		Class<Monumento> type = Monumento.class;
		for (Object lugar : lugares) if (type.isInstance(lugar)) monumentos.add((Monumento)lugar);
		return monumentos;	
	}
	
	public List<Museo> getAllMuseos(){
		List<Museo> museos = new ArrayList<Museo>();
		Class<Museo> type = Museo.class;
		for (Object lugar : lugares) if (type.isInstance(lugar)) museos.add((Museo)lugar);
		return museos;	
	}
	
	public List<? extends Lugar> getLugaresByType(TipoLugar tipoLugar){
		switch (tipoLugar) {
	    	case CCOMERCIAL:
	    		return this.getAllCComerciales();
	    	case HOTEL:
				return this.getAllHoteles();
	    	case MUSEO:
				return this.getAllMuseos();
	    	case MONUMENTO:
				return this.getAllMonumentos();
			default:
				return this.getAllLugares();
	    }
	}
	
	
	
	public List<String> getAllHotelesNames(){
		List<String> hotelesNames = new ArrayList<String>();
		Class<Hotel> type = Hotel.class;
		for (Lugar lugar : lugares) if (type.isInstance(lugar)) hotelesNames.add(lugar.getNombre());
		return hotelesNames;
	}
	
	public List<String> getAllCComercialesNames(){
		List<String> ccomercialesNames = new ArrayList<String>();
		Class<CComercial> type = CComercial.class;
		for (Lugar lugar : lugares) if (type.isInstance(lugar)) ccomercialesNames.add(lugar.getNombre());
		return ccomercialesNames;	
	}
	
	public List<String> getAllMonumentosNames(){
		List<String> monumentosNames = new ArrayList<String>();
		Class<Monumento> type = Monumento.class;
		for (Lugar lugar : lugares) if (type.isInstance(lugar)) monumentosNames.add(lugar.getNombre());
		return monumentosNames;	
	}
	
	public List<String> getAllMuseosNames(){
		List<String> museosNames = new ArrayList<String>();
		Class<Museo> type = Museo.class;
		for (Lugar lugar : lugares) if (type.isInstance(lugar)) museosNames.add(lugar.getNombre());
		return museosNames;	
	}
	
	public List<String> getAllLugaresNames() {
		List<String> lugaresNames = new ArrayList<String>();
		for (Lugar lugar : lugares) lugaresNames.add(lugar.getNombre());
		return lugaresNames;
	}	
	
	public List<String> getLugaresNamesByType(TipoLugar tipoLugar){
		switch (tipoLugar) {
    	case CCOMERCIAL:
    		return this.getAllCComercialesNames();
    	case HOTEL:
			return this.getAllHotelesNames();
    	case MUSEO:
			return this.getAllMuseosNames();
    	case MONUMENTO:
			return this.getAllMonumentosNames();
		default:
			return this.getAllLugaresNames();
		}
	}
	
	public Lugar getLugarByName(String nombre){
		for (Lugar lugar : lugares)
			if (lugar.getNombre().equals(nombre))
					return lugar;
		return null;
	}
	
}
